/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.torresquintero.oncologos.secretaria.controladores;

import com.torresquintero.oncologos.common.entityUtilities.PacienteUtilities;
import com.torresquintero.oncologos.common.factory.FactoryEntityManager;
import com.torresquintero.oncologos.entidades.Acudiente;
import com.torresquintero.oncologos.entidades.Paciente;
import com.torresquintero.oncologos.entidades.Telefono;
import com.torresquintero.oncologos.enumeraciones.TipoDocumentoEnum;
import com.torresquintero.oncologos.enumeraciones.TipoTelefonoEnum;
import java.awt.Stroke;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;

/**
 *
 * @author Camilo Andres
 */
public class PacientesController {

    private static PacientesController control;
    private EntityManager em;
    /**
     * Paciente a administrar.
     */
    private static Paciente paciente;
    /**7
     * Lista de acudientes del paciente.
     */
    private List<Acudiente> acudientes;
    /**
     * Listado de telefonos del paciente.
     */
    private List<Telefono> telefonos;

    private PacientesController() {
        em = FactoryEntityManager.getEm();
        acudientes=new ArrayList<Acudiente>();
            telefonos=new ArrayList<Telefono>();
    }

    public static PacientesController getInstance() {
        if (control == null) {
            control = new PacientesController();
        }
        return control;
    }

    /**
     * Metodo para crear un paciente.
     * @param pac 
     */
    public void crearPaciente(Paciente pac) {
        em.getTransaction().begin();
        em.persist(pac);

        for (Acudiente acudiente : acudientes) {
            acudiente.setPaciente(paciente);
        }

        em.getTransaction().commit();
        control=new PacientesController();
    }

    /**
     * Editar a un pacienete.
     * @param pac  el paciente a editar.
     */
    public void editarPaciente(Paciente pac) {
        em.getTransaction().begin();
        em.merge(pac);
        em.flush();
        em.getTransaction().commit();
    }

    /**
     * Metoodo para agregar un acudiente al arrglo
     * @param acudiente 
     */
    public void agregarAcudiente(Acudiente acudiente) throws Exception {
        if (acudientes.contains(acudiente) == false) {
            acudientes.add(acudiente);
        }else{
            throw new Exception("Yaesta registrado este acudiente a su nombre.");
        }
        
    }
    /**
     * Metodo para quietar un acudiente del paciente.
     * @param acudiente 
     */
    public void quitarAcudiente(Acudiente acudiente){
        acudientes.remove(acudiente);
    }
    /**
     * Metodo para agregar un telefono al paciente.
     * @param telefono 
     */
    public void agregarTelefono(String telefono){
        Telefono tel=new Telefono(telefono, paciente, TipoTelefonoEnum.FIJO);
        telefonos.add(tel);
    }

    /**
     * Listado de todos los pacientes.
     * @return 
     */
    public List<Paciente> listarTiposLosPacientes() {
        return PacienteUtilities.listarTodosLosPaciente();
    }

    /**
     * Buscar un paciente.
     * @param documento
     * @return 
     */
    public Paciente buscarPaciente(String documento,TipoDocumentoEnum tipoDoc) {

        paciente = PacienteUtilities.buscarPaciente(documento, tipoDoc);
        if (paciente != null) {
            acudientes = em.createNamedQuery(Acudiente.FIND_ACUDIENTE_BY_PACIENTE).
                    setParameter(Acudiente.PARAMETRO_ID, paciente.getDocumento()).
                    getResultList();
            telefonos = paciente.getTelefonos();
            paciente.setAcudientes(acudientes);
            

        }else{
            acudientes=new ArrayList<Acudiente>();
            telefonos=new ArrayList<Telefono>();
        }
        return paciente;
    }

    public List<Acudiente> getAcudientes() {
        return acudientes;
    }

    public void setAcudientes(List<Acudiente> acudientes) {
        this.acudientes = acudientes;
    }

    public static Paciente getPaciente() {
        return paciente;
    }

    public static void setPaciente(Paciente paciente) {
        PacientesController.paciente = paciente;
    }

    public List<Telefono> getTelefonos() {
        return telefonos;
    }

    public void setTelefonos(List<Telefono> telefonos) {
        this.telefonos = telefonos;
    }
    
    
}
